package com.leetcodehot.problems;

import java.util.Arrays;

public class problems2563 {
    /**
     * 给你一个下标从 0 开始、长度为 n 的整数数组 nums ，和两个整数 lower 和 upper ，返回 公平数对的数目 。
     * <p>
     * 如果 (i, j) 数对满足以下情况，则认为它是一个 公平数对 ：
     * <p>
     * 0 <= i < j < n，且
     * lower <= nums[i] + nums[j] <= upper
     * <p>
     * <p>
     * 示例 1：
     * <p>
     * 输入：nums = [0,1,7,4,4,5], lower = 3, upper = 6
     * 输出：6
     * 解释：共计 6 个公平数对：(0,3)、(0,4)、(0,5)、(1,3)、(1,4) 和 (1,5) 。
     * 示例 2：
     * <p>
     * 输入：nums = [1,7,9,2,5], lower = 11, upper = 11
     * 输出：1
     * 解释：只有单个公平数对：(2,3) 。
     */
    public long countFairPairs(int[] nums, int lower, int upper) {
        int n = nums.length;
        Arrays.sort(nums);
        long res = 0;
        for (int i = 0; i < n; i++) {
            int x = nums[i];
            int left = i;
            int right = n;
            while (left + 1 < right) {
                int mid = left + (right - left) / 2;
                if (x + nums[mid] < lower) {
                    left = mid;
                } else {
                    right = mid;
                }
            }//r是第一个满足 lower<=nums[i]+nums[j]的下标
            int l = right;
            left = i;
            right = n;
            while (left + 1 < right) {
                int mid = left + (right - left) / 2;
                if (x + nums[mid] <= upper) {
                    left = mid;
                } else {
                    right = mid;
                }
            }//l是满足的下标
            int r = left;
            res += r - l + 1;
        }
        return res;
    }
}